package cn.tedu.egweibo.controller;

import cn.tedu.egweibo.mapper.UserMapper;
import cn.tedu.egweibo.pojo.dto.UserRegDTO;
import cn.tedu.egweibo.pojo.entity.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/users")
@Api(tags = "用户模块")
    public class UserController {
        private Map<String,User> users = new HashMap<>();

        @Autowired
        private UserMapper userMapper;
        /*
            @RequestBody注解，用于告知SpringMVC,请求的消息正文中是以JSON格式传递的数据
         */
        @PostMapping("/reg")
        @ApiOperation("用户注册")
        public int regUser(@RequestBody UserRegDTO userRegDTO){
            //trace通常进入一个方法时就应当记录一次，用于掌握程序的执行过程
            log.trace("UserController:regUser()");
            //info是普通的信息提示，例如执行一个业务逻辑时，可以进行提示，但未必每个方法都要
            log.info("处理用户注册");
            //System.out.println(userRegDTO);
            //debug用于输出如：程序处理后的结果，来排除程序可能的逻辑bug
            log.debug(userRegDTO.toString());//原本向控制台输出的某个值都用debug代替
            //验证是否为重复的用户
            if(userMapper.findByUsername(userRegDTO.getUsername())!=null){
            /*
            if ("admin".equals(userRegDTO.getUsername())){//比如admin是管理员账号
                log.warn("正在使用管理员账号尝试登录");
            }

             */
                log.warn("登录失败，用户名不正确");
                return 2;
            }

            User user = new User();
            BeanUtils.copyProperties(userRegDTO,user);
            user.setCreated(new Date());
            log.debug(user.toString());
            userMapper.insert(user);
            return 1;
        }
}
